package com.tedu.api;

import org.junit.Test;

import java.util.Locale;
import java.util.Scanner;

/**
 * JavaSE:基础语法、JavaOOP面向对象编程、JavaAPI（帮助文档，理解：字典）
 *
 * JavaAPI【内置：Java编辑好的】提供大量类、接口、抽象类、异常、错误
 * 【预计提供好的类库：8000.JavaAPI只学重点】
 *
 * JavaAPI：字符串，包装类，集合【泛型】，线程，
 *         多线程【开发--大数据】、IO流、Socket套接字【网络编程】
 *
 *   jdk1.8.chm帮助文档   理解： 新华字典    会查类，接口，抽象，..使用
 *   JDK版本---帮助文档   根据用什么版本JDK，查对应版本帮助文档
 *
 *   必须会查API      String类----什么包下？
 *                   java.lang【默认，不需要导包】
 *
 *     java：错误：无效的源发行版：17
 *     maven项目jdk版本：17
 */
public class StringAPI {
    /**
     * JDK1.8 StringAPI类库：构造器怎么用
     * 包位置：java.lang 【不需要导入包：System\String】
     * 特点：不需要导入包、不可以被继承、字符数组、定义完毕无法修改
     *      修改可以覆盖，String类是final\Java字符串编码集
     *      顶级UniCode：GBK、UTF-8,任何一个字符对应2个字节！
     * 字符串底层：封装了字符数组及针对字符数组的操做算法
     * 字符数组===字符串
     * 定义：String str="直接量"；  给定值创建String字符串对象
     *      String str=new String();创建String字符串对象
     */
    @Test
    public void testString(){
        String str="字符串";
        System.out.println(str);
        char[] c={'字','符','串'};//字符数组：静态字符数组
        System.out.println(c);
        //字符串创建出来，无法修改，因为String是由final修饰
        String s="hello world";
        s="123";
        System.out.println(s);
    }
    /**
     *定义给定值的方式：String str=“java123”
     *                            静态字符串（字面量/常量/链接后结果）
     * 创建在String常量池中，对于重复创建静态字符串，JAM虚拟机首先
     * 会在常量池中进行查找，如果找到返回i对象，找不到继续创建对象
     * JVM虚拟机的堆内存中开辟一块空间，保存曾经使用过的字面量、常量
     * 一但后期又使用相同的字面量、常量，不会创建对象，直接使用老对象
     *
     * 特点：减少内存开销，提供性能！
     */
    @Test
    public void testStrings() {
        String s1 = "java123";//公共常量池
        String s2 = "java123";//不会创建对象，从常量池java123
        System.out.println(s1 == s2);//true
        String s = "java";//s对象  不可修改
        String s3 = s + "123"; //s3对象=s对象=“123”；  s3新对象
        System.out.println(s1 == s3);//java123 ==java123  true
        String s4 = "java" + "123";//右侧：直接量拼接，静态字符串，存入常量池中
        System.out.println(s2 == s4); //
        // s2的java123从常量池中获取，s4拼接后静态字符串，从常量池中获取
        //-------------上面的代码：给定值定义字符串方式：拥有常量池-----------
        //-------------上面的代码：创建字符串方式：创建新对象-----------
        //-------------上面的代码：创建字符串方式：创建新对象-----------
        String s5=new String("java123");
        //new出来的对象，一定是新对象，不存在常量池
        System.out.println(s4==s5);
    }
    /**
     * String API 方法
     * length方法   返回值：int
     *
     */
    @Test
    public void testLength(){
        String str="Hello World";//10
        System.out.println(str.length());
        str=" 我爱Java";
        System.out.println(str.length());
    }
    /**
     * indexOf方法 ----重载功能：修饰符  返回值  方法名  一致
     *                                      参数  不一致
     * indexOf（String index）
     * 第一个参数  String index：传入下标位
     * 作用：查找指定字符串在当前字符串中位置，首位置
     *      如果查找相同名称，向下一位查找，不包括
     *      如果匹配到对应字符，输出首位置下标
     *      如果没有匹配的，输出-1
     *      lastIndexOf(String str)方法
     *      作用：找到匹配字符串中对应最后出现字符串位置
     */
    @Test
    public  void testIndexOf(){
        String str="thinking in java";//java编程思想【第四版】
        //返回值：下标位
        int index=str.indexOf("in");//用处：查找第一位相同
        System.out.println("打印下标位："+index);
        index=str.indexOf("in",6);
        //用处：查找指定某一位相同
        System.out.println("指定下标位："+index);
        //lastIndexOf（）找到最后一次出现的下标位置
        index=str.lastIndexOf("in");
        System.out.println("最后的下标位："+index);
    }
    /**
     * subStringAPI针对字符串提供3种方法：截取，替换，分割
     * subString（）截取   返回值：String
     * subString（int start，int end）
     * 作用：截取字符串，从下标start位置开始截取，截取到end下标位置
     * subString（int end）
     * 作用：截取字符串，从下标index位置开始截取，截取到最后
     * 通用口诀：含头不含尾
     */
    @Test
    public void testSubString(){
        String url="www.baidu.com";//需求：通过截取字符串baidu
        //  url=url.substring(3,10);//  .baidu.3,10     9.12 .co
        System.out.println("截取子字符串："+url);
        //需求：通过截取字符串.com
        url=url.substring(9);
        System.out.println("截取子字符串，截取到最后"+url);

    }
    /**
     * charAt方法     返回值char
     * 作用：返回当前字符串中指定位置的字符
     * StringIndexOutOfBoundsException  异常
     * 字符串下标越界异常---出现异常：下标超出范围
     */
    @Test
    public void testCharAt(){
        String str="thinking in java";
        char c=str.charAt(9);
        System.out.println("获取对应字符："+c);
    }
    /**
     * trim方法   返回值 String
     * 作用：去掉当前字符串前后空格【转大小写叠加使用】
     * 验证码：xD4e    前台显示：xD4e  用户输入：xd4e
     * toLowerCase方法  返回值String
     * 作用：将字符串中所有字符转换为小写
     * toUpperCase方法  返回值String
     * 作用：将字符串中所有字符转换为大写
     */
    @Test
    public void testTrim(){
        String str=" xD4e ";//后台传入前后都加空格，xD4e
        //后台传入前台字符串---一律去空格
        str=str.trim().toLowerCase().toUpperCase();
        System.out.println("去掉空格"+str);
    }
    /**
     * [PHP]正则表达式：语法-元字符^【1-9】* $
     * 验证字符串
     * matches方法    返回值boolean
     * 作用：用于验证字符串，使用正则表达式进行验证【过滤字符】
     *     返回true验证成功，返回false正则验证失败
     */
    public static void main(String[] args) {
        String regex="^[0-9]*$";
        System.out.println("请输入");
        //从控制台输入【模拟用户输入】
        Scanner input=new Scanner(System.in);
        //判断：如果正确通过，返回值是数字，反之相反
        if (input.nextLine().matches(regex)){
            System.out.println("是数字");
        }else {
            System.out.println("不是数字");
        }
    }

    /**
     * replace方法  替换   返回值：String
     * replace(String a,String b)
     * 第一个参数  String a 传入查找字符
     * 第二个参数  String b 传入替换字符
     * 作用：用于匹配字符中存在字符，匹配成功，匹配成新自符
     * replaceAll(String regex,String b)
     * 作用：用于全部匹配字符中存在字符
     */
    @Test
    public void testReplace(){
        String str="我爱Java";
        str=str.replace("Java","Python");
        System.out.println("替换后的字符串："+str);

        String regex="^[\\u4e00-\\u9fa5]{0,}$";//验证汉字
        String say="我去年买了一块表";
        say=say.replaceAll(regex,"*******");//支持正则
        System.out.println("通过正则替换后的字符串："+say);
    }
    /**
     * split方法    分割    返回值：String【】
     * 作用：用于按照“正确”或者“字符串”的方式进行分割字符串
     *   www.baidu.com  按照.的方式获取
     *   split写.   正则表达式：.匹配一个字符
     *   split写.    注意：转义成//
     */
    @Test
    public void testSplit(){
        String url="www.baidu.com";
        String[] urls=url.split("\\.");
        //System.out.println(urls[1]);
        //思考：代码哪里出现错误ArrayIndexOutOfBoundsException
        //打印字符串数组---增强for  数组数据类型  引用，  遍历
        for(String s:urls){
            System.out.println("分割后元素值："+s);
        }
    }
    /**
     * valueOf()
     *
     */
    @Test
    public void testValueOf(){
        int i=123;//基础数据类型转为字符串
        String s=String.valueOf(i);
        if(s.equals("123")){ //s对象==“123” 判断对象 flase
            //s对象.equals（“123”）判断值 true
            System.out.println("是字符串");
        }else {
            System.out.println("不是字符串");
        }
    }
}